package com.liush.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liush.srb.core.pojo.entity.Dict;
import com.liush.srb.core.pojo.vo.DictExcelVO;
import com.liush.srb.core.service.DictService;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: liush
 * @CreateTime: 2023-03-28  16:24
 * @Description: easyexcel监听器
 */
public class DictExcelVoListener extends AnalysisEventListener<DictExcelVO> {

    private int limit = 100;
    private List<DictExcelVO> dictExcelVos = new ArrayList<>();
    private DictService dictService;

    public DictExcelVoListener(DictService dictService) {
        this.dictService = dictService;
    }

    // 每读取一行数据回调一次
    @Override
    public void invoke(DictExcelVO data, AnalysisContext analysisContext) {
        dictExcelVos.add(data);
        /*问题：
         * 1、批量保存 需要的参数类型为Dict
         * 2、如果数据库中已存在 excel中的某个数据字典，不保存
         */
        if (dictExcelVos.size() == limit) {
            List<Dict> dicts = convertExcelVos2Dicts();
            // 保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVos.clear();
        }
    }

    // 抽取的转换excelVo集合为dict集合的工具方法
    private List<Dict> convertExcelVos2Dicts() {
        return dictExcelVos.stream().map(dictExcelVo -> {
            // 将dictExcelVO对象转为Dict对象
            Dict dict = new Dict();
            // 将源对象 相同的属性名和数据类型的 属性值 拷贝给目标对象   两个类型必须有get/set方法
            BeanUtils.copyProperties(dictExcelVo, dict);
            return dict;
        }).filter(dict -> {
            // 筛选dict对象，如果数据库已存在该对象过滤掉 如果id已存在 不保存
            return dictService.count(Wrappers.lambdaQuery(Dict.class)
                    .eq(Dict::getId, dict.getId())) == 0;
        }).collect(Collectors.toList());
    }

    // 整个文档解析完毕后回调
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (dictExcelVos.size() > 0) {
            List<Dict> dicts = convertExcelVos2Dicts();
            // 保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVos.clear();
        }
    }
}
